#include <iostream>
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;

int n,k;
int next[110];
int move[110][30];
bool done[110][110];
string res;
string p,state;
void getNext(string &s)
{
    next[0]=-1;
    for(int i=0,j;i<s.size()-1;i++)
    {
        for(j=next[i];1;j=next[j])
        {
            if(s[j+1]==s[i+1])
            {
                next[i+1]=j+1;
                break;
            }
            if(j==-1)
            {
                next[i+1]=-1;
                break;
            }
        }
    }
}
bool dfs(int pos,int pre)
{
    if(pos>=p.size())
    {
        if(pre==p.size()&&state[pos-pre]!='1') return false;
        if(state[pos-p.size()]=='1'&&pre!=p.size()) return false;
    }
    if(pos==n) return true;
    if(done[pos][pre]) return false;
    else
    {
        for(int i=0;i<k;i++)
        {
            if(dfs(pos+1,move[pre][i]))
            {
                res+=(i+'a');
                return true;
            }
        }
    }
    done[pos][pre]=true;
    return false;
}
int main()
{
    while(cin>>n>>k>>p>>state)
    {
        res="";
        getNext(p);
        fill(done[0],done[0]+110*110,false);
        for(int i=0;i<=p.size();i++)
        {
            for(int t=0;t<k;t++)
            {
                char c='a'+t;
                for(int j=i-1;1;j=next[j])
                {
                    if(p[j+1]==c)
                    {
                       move[i][t]=j+2;
                       break;
                    }
                    if(j==-1)
                    {
                        move[i][t]=0;
                        break;
                    }
                }
            }
        }
        if(dfs(0,0)) reverse(res.begin(),res.end()),cout<<res<<endl;
        else cout<<"No solution"<<endl;
    }
    return 0;
}
